/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladoresJpa;

import controladoresJpa.exceptions.IllegalOrphanException;
import controladoresJpa.exceptions.NonexistentEntityException;
import controladoresJpa.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import model.DicionarioMER;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Persistence;
import model.Entidade;
import model.Tabela;
import model.AssociacaoEntidadeAtributo;
import model.HierarquiaEntidade;
import model.ParticipacaoEntidadeRelacionamento;

/**
 * Módulo MER
 * Classe de Entidade do Banco de Dados, gerada automaticamente, porém com certas modificações
 * @author Eduardo, Maylon e Kamilla
 */
public class EntidadeJpaController implements Serializable {

    public EntidadeJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;
public EntidadeJpaController(){
    if(emf==null)
        emf = Persistence.createEntityManagerFactory("unb-gama-threedsPU");
            }
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Entidade entidade) throws PreexistingEntityException, Exception {
        if (entidade.getDicionarioMERList() == null) {
            entidade.setDicionarioMERList(new ArrayList<DicionarioMER>());
        }
        if (entidade.getTabelaList() == null) {
            entidade.setTabelaList(new ArrayList<Tabela>());
        }
        if (entidade.getAssociacaoEntidadeAtributoList() == null) {
            entidade.setAssociacaoEntidadeAtributoList(new ArrayList<AssociacaoEntidadeAtributo>());
        }
        if (entidade.getHierarquiaEntidadeList() == null) {
            entidade.setHierarquiaEntidadeList(new ArrayList<HierarquiaEntidade>());
        }
        if (entidade.getHierarquiaEntidadeList1() == null) {
            entidade.setHierarquiaEntidadeList1(new ArrayList<HierarquiaEntidade>());
        }
        if (entidade.getParticipacaoEntidadeRelacionamentoList() == null) {
            entidade.setParticipacaoEntidadeRelacionamentoList(new ArrayList<ParticipacaoEntidadeRelacionamento>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<DicionarioMER> attachedDicionarioMERList = new ArrayList<DicionarioMER>();
            for (DicionarioMER dicionarioMERListDicionarioMERToAttach : entidade.getDicionarioMERList()) {
                dicionarioMERListDicionarioMERToAttach = em.getReference(dicionarioMERListDicionarioMERToAttach.getClass(), dicionarioMERListDicionarioMERToAttach.getId());
                attachedDicionarioMERList.add(dicionarioMERListDicionarioMERToAttach);
            }
            entidade.setDicionarioMERList(attachedDicionarioMERList);
            List<Tabela> attachedTabelaList = new ArrayList<Tabela>();
            for (Tabela tabelaListTabelaToAttach : entidade.getTabelaList()) {
                tabelaListTabelaToAttach = em.getReference(tabelaListTabelaToAttach.getClass(), tabelaListTabelaToAttach.getNome());
                attachedTabelaList.add(tabelaListTabelaToAttach);
            }
            entidade.setTabelaList(attachedTabelaList);
            List<AssociacaoEntidadeAtributo> attachedAssociacaoEntidadeAtributoList = new ArrayList<AssociacaoEntidadeAtributo>();
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach : entidade.getAssociacaoEntidadeAtributoList()) {
                associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach = em.getReference(associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach.getClass(), associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach.getCodigo());
                attachedAssociacaoEntidadeAtributoList.add(associacaoEntidadeAtributoListAssociacaoEntidadeAtributoToAttach);
            }
            entidade.setAssociacaoEntidadeAtributoList(attachedAssociacaoEntidadeAtributoList);
            List<HierarquiaEntidade> attachedHierarquiaEntidadeList = new ArrayList<HierarquiaEntidade>();
            for (HierarquiaEntidade hierarquiaEntidadeListHierarquiaEntidadeToAttach : entidade.getHierarquiaEntidadeList()) {
                hierarquiaEntidadeListHierarquiaEntidadeToAttach = em.getReference(hierarquiaEntidadeListHierarquiaEntidadeToAttach.getClass(), hierarquiaEntidadeListHierarquiaEntidadeToAttach.getCodigo());
                attachedHierarquiaEntidadeList.add(hierarquiaEntidadeListHierarquiaEntidadeToAttach);
            }
            entidade.setHierarquiaEntidadeList(attachedHierarquiaEntidadeList);
            List<HierarquiaEntidade> attachedHierarquiaEntidadeList1 = new ArrayList<HierarquiaEntidade>();
            for (HierarquiaEntidade hierarquiaEntidadeList1HierarquiaEntidadeToAttach : entidade.getHierarquiaEntidadeList1()) {
                hierarquiaEntidadeList1HierarquiaEntidadeToAttach = em.getReference(hierarquiaEntidadeList1HierarquiaEntidadeToAttach.getClass(), hierarquiaEntidadeList1HierarquiaEntidadeToAttach.getCodigo());
                attachedHierarquiaEntidadeList1.add(hierarquiaEntidadeList1HierarquiaEntidadeToAttach);
            }
            entidade.setHierarquiaEntidadeList1(attachedHierarquiaEntidadeList1);
            List<ParticipacaoEntidadeRelacionamento> attachedParticipacaoEntidadeRelacionamentoList = new ArrayList<ParticipacaoEntidadeRelacionamento>();
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach : entidade.getParticipacaoEntidadeRelacionamentoList()) {
                participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach = em.getReference(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach.getClass(), participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach.getPapel());
                attachedParticipacaoEntidadeRelacionamentoList.add(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamentoToAttach);
            }
            entidade.setParticipacaoEntidadeRelacionamentoList(attachedParticipacaoEntidadeRelacionamentoList);
            em.persist(entidade);
            for (DicionarioMER dicionarioMERListDicionarioMER : entidade.getDicionarioMERList()) {
                dicionarioMERListDicionarioMER.getEntidadeList().add(entidade);
                dicionarioMERListDicionarioMER = em.merge(dicionarioMERListDicionarioMER);
            }
            for (Tabela tabelaListTabela : entidade.getTabelaList()) {
                tabelaListTabela.getEntidadeList().add(entidade);
                tabelaListTabela = em.merge(tabelaListTabela);
            }
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListAssociacaoEntidadeAtributo : entidade.getAssociacaoEntidadeAtributoList()) {
                Entidade oldNomeentidadeOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo = associacaoEntidadeAtributoListAssociacaoEntidadeAtributo.getNomeentidade();
                associacaoEntidadeAtributoListAssociacaoEntidadeAtributo.setNomeentidade(entidade);
                associacaoEntidadeAtributoListAssociacaoEntidadeAtributo = em.merge(associacaoEntidadeAtributoListAssociacaoEntidadeAtributo);
                if (oldNomeentidadeOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo != null) {
                    oldNomeentidadeOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo.getAssociacaoEntidadeAtributoList().remove(associacaoEntidadeAtributoListAssociacaoEntidadeAtributo);
                    oldNomeentidadeOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo = em.merge(oldNomeentidadeOfAssociacaoEntidadeAtributoListAssociacaoEntidadeAtributo);
                }
            }
            for (HierarquiaEntidade hierarquiaEntidadeListHierarquiaEntidade : entidade.getHierarquiaEntidadeList()) {
                Entidade oldNomesubclasseOfHierarquiaEntidadeListHierarquiaEntidade = hierarquiaEntidadeListHierarquiaEntidade.getNomesubclasse();
                hierarquiaEntidadeListHierarquiaEntidade.setNomesubclasse(entidade);
                hierarquiaEntidadeListHierarquiaEntidade = em.merge(hierarquiaEntidadeListHierarquiaEntidade);
                if (oldNomesubclasseOfHierarquiaEntidadeListHierarquiaEntidade != null) {
                    oldNomesubclasseOfHierarquiaEntidadeListHierarquiaEntidade.getHierarquiaEntidadeList().remove(hierarquiaEntidadeListHierarquiaEntidade);
                    oldNomesubclasseOfHierarquiaEntidadeListHierarquiaEntidade = em.merge(oldNomesubclasseOfHierarquiaEntidadeListHierarquiaEntidade);
                }
            }
            for (HierarquiaEntidade hierarquiaEntidadeList1HierarquiaEntidade : entidade.getHierarquiaEntidadeList1()) {
                Entidade oldNomesuperclasseOfHierarquiaEntidadeList1HierarquiaEntidade = hierarquiaEntidadeList1HierarquiaEntidade.getNomesuperclasse();
                hierarquiaEntidadeList1HierarquiaEntidade.setNomesuperclasse(entidade);
                hierarquiaEntidadeList1HierarquiaEntidade = em.merge(hierarquiaEntidadeList1HierarquiaEntidade);
                if (oldNomesuperclasseOfHierarquiaEntidadeList1HierarquiaEntidade != null) {
                    oldNomesuperclasseOfHierarquiaEntidadeList1HierarquiaEntidade.getHierarquiaEntidadeList1().remove(hierarquiaEntidadeList1HierarquiaEntidade);
                    oldNomesuperclasseOfHierarquiaEntidadeList1HierarquiaEntidade = em.merge(oldNomesuperclasseOfHierarquiaEntidadeList1HierarquiaEntidade);
                }
            }
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento : entidade.getParticipacaoEntidadeRelacionamentoList()) {
                Entidade oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento = participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento.getNomeentidade();
                participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento.setNomeentidade(entidade);
                participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento = em.merge(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento);
                if (oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento != null) {
                    oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento.getParticipacaoEntidadeRelacionamentoList().remove(participacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento);
                    oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento = em.merge(oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListParticipacaoEntidadeRelacionamento);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findEntidade(entidade.getNome()) != null) {
                throw new PreexistingEntityException("Entidade " + entidade + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Entidade entidade) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Entidade persistentEntidade = em.find(Entidade.class, entidade.getNome());
            List<DicionarioMER> dicionarioMERListOld = persistentEntidade.getDicionarioMERList();
            List<DicionarioMER> dicionarioMERListNew = entidade.getDicionarioMERList();
            List<Tabela> tabelaListOld = persistentEntidade.getTabelaList();
            List<Tabela> tabelaListNew = entidade.getTabelaList();
            List<AssociacaoEntidadeAtributo> associacaoEntidadeAtributoListOld = persistentEntidade.getAssociacaoEntidadeAtributoList();
            List<AssociacaoEntidadeAtributo> associacaoEntidadeAtributoListNew = entidade.getAssociacaoEntidadeAtributoList();
            List<HierarquiaEntidade> hierarquiaEntidadeListOld = persistentEntidade.getHierarquiaEntidadeList();
            List<HierarquiaEntidade> hierarquiaEntidadeListNew = entidade.getHierarquiaEntidadeList();
            List<HierarquiaEntidade> hierarquiaEntidadeList1Old = persistentEntidade.getHierarquiaEntidadeList1();
            List<HierarquiaEntidade> hierarquiaEntidadeList1New = entidade.getHierarquiaEntidadeList1();
            List<ParticipacaoEntidadeRelacionamento> participacaoEntidadeRelacionamentoListOld = persistentEntidade.getParticipacaoEntidadeRelacionamentoList();
            List<ParticipacaoEntidadeRelacionamento> participacaoEntidadeRelacionamentoListNew = entidade.getParticipacaoEntidadeRelacionamentoList();
            List<String> illegalOrphanMessages = null;
            
            if( associacaoEntidadeAtributoListOld !=null)
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListOldAssociacaoEntidadeAtributo : associacaoEntidadeAtributoListOld) {
                if (!associacaoEntidadeAtributoListNew.contains(associacaoEntidadeAtributoListOldAssociacaoEntidadeAtributo)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain AssociacaoEntidadeAtributo " + associacaoEntidadeAtributoListOldAssociacaoEntidadeAtributo + " since its nomeentidade field is not nullable.");
                }
            }
            
            if( hierarquiaEntidadeListOld !=null)
            for (HierarquiaEntidade hierarquiaEntidadeListOldHierarquiaEntidade : hierarquiaEntidadeListOld) {
                if (!hierarquiaEntidadeListNew.contains(hierarquiaEntidadeListOldHierarquiaEntidade)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain HierarquiaEntidade " + hierarquiaEntidadeListOldHierarquiaEntidade + " since its nomesubclasse field is not nullable.");
                }
            }
            
            if( hierarquiaEntidadeList1Old !=null)
            for (HierarquiaEntidade hierarquiaEntidadeList1OldHierarquiaEntidade : hierarquiaEntidadeList1Old) {
                if (!hierarquiaEntidadeList1New.contains(hierarquiaEntidadeList1OldHierarquiaEntidade)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain HierarquiaEntidade " + hierarquiaEntidadeList1OldHierarquiaEntidade + " since its nomesuperclasse field is not nullable.");
                }
            }
            
            if( participacaoEntidadeRelacionamentoListOld !=null)
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListOldParticipacaoEntidadeRelacionamento : participacaoEntidadeRelacionamentoListOld) {
                if (!participacaoEntidadeRelacionamentoListNew.contains(participacaoEntidadeRelacionamentoListOldParticipacaoEntidadeRelacionamento)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain ParticipacaoEntidadeRelacionamento " + participacaoEntidadeRelacionamentoListOldParticipacaoEntidadeRelacionamento + " since its nomeentidade field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<DicionarioMER> attachedDicionarioMERListNew = new ArrayList<DicionarioMER>();
            
            if( dicionarioMERListNew !=null)
            for (DicionarioMER dicionarioMERListNewDicionarioMERToAttach : dicionarioMERListNew) {
                dicionarioMERListNewDicionarioMERToAttach = em.getReference(dicionarioMERListNewDicionarioMERToAttach.getClass(), dicionarioMERListNewDicionarioMERToAttach.getId());
                attachedDicionarioMERListNew.add(dicionarioMERListNewDicionarioMERToAttach);
            }
            dicionarioMERListNew = attachedDicionarioMERListNew;
            entidade.setDicionarioMERList(dicionarioMERListNew);
            List<Tabela> attachedTabelaListNew = new ArrayList<Tabela>();
            
            if( tabelaListNew !=null)
            for (Tabela tabelaListNewTabelaToAttach : tabelaListNew) {
                tabelaListNewTabelaToAttach = em.getReference(tabelaListNewTabelaToAttach.getClass(), tabelaListNewTabelaToAttach.getNome());
                attachedTabelaListNew.add(tabelaListNewTabelaToAttach);
            }
            tabelaListNew = attachedTabelaListNew;
            entidade.setTabelaList(tabelaListNew);
            List<AssociacaoEntidadeAtributo> attachedAssociacaoEntidadeAtributoListNew = new ArrayList<AssociacaoEntidadeAtributo>();
            
            if( associacaoEntidadeAtributoListNew !=null)
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach : associacaoEntidadeAtributoListNew) {
                associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach = em.getReference(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach.getClass(), associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach.getCodigo());
                attachedAssociacaoEntidadeAtributoListNew.add(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributoToAttach);
            }
            associacaoEntidadeAtributoListNew = attachedAssociacaoEntidadeAtributoListNew;
            entidade.setAssociacaoEntidadeAtributoList(associacaoEntidadeAtributoListNew);
            List<HierarquiaEntidade> attachedHierarquiaEntidadeListNew = new ArrayList<HierarquiaEntidade>();
            
            if( hierarquiaEntidadeListNew!=null)
            for (HierarquiaEntidade hierarquiaEntidadeListNewHierarquiaEntidadeToAttach : hierarquiaEntidadeListNew) {
                hierarquiaEntidadeListNewHierarquiaEntidadeToAttach = em.getReference(hierarquiaEntidadeListNewHierarquiaEntidadeToAttach.getClass(), hierarquiaEntidadeListNewHierarquiaEntidadeToAttach.getCodigo());
                attachedHierarquiaEntidadeListNew.add(hierarquiaEntidadeListNewHierarquiaEntidadeToAttach);
            }
            hierarquiaEntidadeListNew = attachedHierarquiaEntidadeListNew;
            entidade.setHierarquiaEntidadeList(hierarquiaEntidadeListNew);
            List<HierarquiaEntidade> attachedHierarquiaEntidadeList1New = new ArrayList<HierarquiaEntidade>();
            
            if( hierarquiaEntidadeList1New !=null)
            for (HierarquiaEntidade hierarquiaEntidadeList1NewHierarquiaEntidadeToAttach : hierarquiaEntidadeList1New) {
                hierarquiaEntidadeList1NewHierarquiaEntidadeToAttach = em.getReference(hierarquiaEntidadeList1NewHierarquiaEntidadeToAttach.getClass(), hierarquiaEntidadeList1NewHierarquiaEntidadeToAttach.getCodigo());
                attachedHierarquiaEntidadeList1New.add(hierarquiaEntidadeList1NewHierarquiaEntidadeToAttach);
            }
            hierarquiaEntidadeList1New = attachedHierarquiaEntidadeList1New;
            entidade.setHierarquiaEntidadeList1(hierarquiaEntidadeList1New);
            List<ParticipacaoEntidadeRelacionamento> attachedParticipacaoEntidadeRelacionamentoListNew = new ArrayList<ParticipacaoEntidadeRelacionamento>();
            
            if( participacaoEntidadeRelacionamentoListNew !=null)
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach : participacaoEntidadeRelacionamentoListNew) {
                participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach = em.getReference(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach.getClass(), participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach.getPapel());
                attachedParticipacaoEntidadeRelacionamentoListNew.add(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamentoToAttach);
            }
            participacaoEntidadeRelacionamentoListNew = attachedParticipacaoEntidadeRelacionamentoListNew;
            entidade.setParticipacaoEntidadeRelacionamentoList(participacaoEntidadeRelacionamentoListNew);
            entidade = em.merge(entidade);
            
            if( dicionarioMERListOld !=null)
            for (DicionarioMER dicionarioMERListOldDicionarioMER : dicionarioMERListOld) {
                if (!dicionarioMERListNew.contains(dicionarioMERListOldDicionarioMER)) {
                    dicionarioMERListOldDicionarioMER.getEntidadeList().remove(entidade);
                    dicionarioMERListOldDicionarioMER = em.merge(dicionarioMERListOldDicionarioMER);
                }
            }
            
            if( dicionarioMERListNew !=null)
            for (DicionarioMER dicionarioMERListNewDicionarioMER : dicionarioMERListNew) {
                if (!dicionarioMERListOld.contains(dicionarioMERListNewDicionarioMER)) {
                    dicionarioMERListNewDicionarioMER.getEntidadeList().add(entidade);
                    dicionarioMERListNewDicionarioMER = em.merge(dicionarioMERListNewDicionarioMER);
                }
            }
            
            if( tabelaListOld !=null)
            for (Tabela tabelaListOldTabela : tabelaListOld) {
                if (!tabelaListNew.contains(tabelaListOldTabela)) {
                    tabelaListOldTabela.getEntidadeList().remove(entidade);
                    tabelaListOldTabela = em.merge(tabelaListOldTabela);
                }
            }
            
            if( tabelaListNew !=null)
            for (Tabela tabelaListNewTabela : tabelaListNew) {
                if (!tabelaListOld.contains(tabelaListNewTabela)) {
                    tabelaListNewTabela.getEntidadeList().add(entidade);
                    tabelaListNewTabela = em.merge(tabelaListNewTabela);
                }
            }
            
            if( associacaoEntidadeAtributoListNew !=null)
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo : associacaoEntidadeAtributoListNew) {
                if (!associacaoEntidadeAtributoListOld.contains(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo)) {
                    Entidade oldNomeentidadeOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo = associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.getNomeentidade();
                    associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.setNomeentidade(entidade);
                    associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo = em.merge(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo);
                    if (oldNomeentidadeOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo != null && !oldNomeentidadeOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.equals(entidade)) {
                        oldNomeentidadeOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo.getAssociacaoEntidadeAtributoList().remove(associacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo);
                        oldNomeentidadeOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo = em.merge(oldNomeentidadeOfAssociacaoEntidadeAtributoListNewAssociacaoEntidadeAtributo);
                    }
                }
            }
            
            if( hierarquiaEntidadeListNew !=null)
            for (HierarquiaEntidade hierarquiaEntidadeListNewHierarquiaEntidade : hierarquiaEntidadeListNew) {
                if (!hierarquiaEntidadeListOld.contains(hierarquiaEntidadeListNewHierarquiaEntidade)) {
                    Entidade oldNomesubclasseOfHierarquiaEntidadeListNewHierarquiaEntidade = hierarquiaEntidadeListNewHierarquiaEntidade.getNomesubclasse();
                    hierarquiaEntidadeListNewHierarquiaEntidade.setNomesubclasse(entidade);
                    hierarquiaEntidadeListNewHierarquiaEntidade = em.merge(hierarquiaEntidadeListNewHierarquiaEntidade);
                    if (oldNomesubclasseOfHierarquiaEntidadeListNewHierarquiaEntidade != null && !oldNomesubclasseOfHierarquiaEntidadeListNewHierarquiaEntidade.equals(entidade)) {
                        oldNomesubclasseOfHierarquiaEntidadeListNewHierarquiaEntidade.getHierarquiaEntidadeList().remove(hierarquiaEntidadeListNewHierarquiaEntidade);
                        oldNomesubclasseOfHierarquiaEntidadeListNewHierarquiaEntidade = em.merge(oldNomesubclasseOfHierarquiaEntidadeListNewHierarquiaEntidade);
                    }
                }
            }
            
            if( hierarquiaEntidadeList1New !=null)
            for (HierarquiaEntidade hierarquiaEntidadeList1NewHierarquiaEntidade : hierarquiaEntidadeList1New) {
                if (!hierarquiaEntidadeList1Old.contains(hierarquiaEntidadeList1NewHierarquiaEntidade)) {
                    Entidade oldNomesuperclasseOfHierarquiaEntidadeList1NewHierarquiaEntidade = hierarquiaEntidadeList1NewHierarquiaEntidade.getNomesuperclasse();
                    hierarquiaEntidadeList1NewHierarquiaEntidade.setNomesuperclasse(entidade);
                    hierarquiaEntidadeList1NewHierarquiaEntidade = em.merge(hierarquiaEntidadeList1NewHierarquiaEntidade);
                    if (oldNomesuperclasseOfHierarquiaEntidadeList1NewHierarquiaEntidade != null && !oldNomesuperclasseOfHierarquiaEntidadeList1NewHierarquiaEntidade.equals(entidade)) {
                        oldNomesuperclasseOfHierarquiaEntidadeList1NewHierarquiaEntidade.getHierarquiaEntidadeList1().remove(hierarquiaEntidadeList1NewHierarquiaEntidade);
                        oldNomesuperclasseOfHierarquiaEntidadeList1NewHierarquiaEntidade = em.merge(oldNomesuperclasseOfHierarquiaEntidadeList1NewHierarquiaEntidade);
                    }
                }
            }
            
            if( participacaoEntidadeRelacionamentoListNew !=null)
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento : participacaoEntidadeRelacionamentoListNew) {
                if (!participacaoEntidadeRelacionamentoListOld.contains(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento)) {
                    Entidade oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento = participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.getNomeentidade();
                    participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.setNomeentidade(entidade);
                    participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento = em.merge(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento);
                    if (oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento != null && !oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.equals(entidade)) {
                        oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento.getParticipacaoEntidadeRelacionamentoList().remove(participacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento);
                        oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento = em.merge(oldNomeentidadeOfParticipacaoEntidadeRelacionamentoListNewParticipacaoEntidadeRelacionamento);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                String id = entidade.getNome();
                if (findEntidade(id) == null) {
                    throw new NonexistentEntityException("The entidade with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(String id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Entidade entidade;
            try {
                entidade = em.getReference(Entidade.class, id);
                entidade.getNome();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The entidade with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<AssociacaoEntidadeAtributo> associacaoEntidadeAtributoListOrphanCheck = entidade.getAssociacaoEntidadeAtributoList();
            for (AssociacaoEntidadeAtributo associacaoEntidadeAtributoListOrphanCheckAssociacaoEntidadeAtributo : associacaoEntidadeAtributoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Entidade (" + entidade + ") cannot be destroyed since the AssociacaoEntidadeAtributo " + associacaoEntidadeAtributoListOrphanCheckAssociacaoEntidadeAtributo + " in its associacaoEntidadeAtributoList field has a non-nullable nomeentidade field.");
            }
            List<HierarquiaEntidade> hierarquiaEntidadeListOrphanCheck = entidade.getHierarquiaEntidadeList();
            for (HierarquiaEntidade hierarquiaEntidadeListOrphanCheckHierarquiaEntidade : hierarquiaEntidadeListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Entidade (" + entidade + ") cannot be destroyed since the HierarquiaEntidade " + hierarquiaEntidadeListOrphanCheckHierarquiaEntidade + " in its hierarquiaEntidadeList field has a non-nullable nomesubclasse field.");
            }
            List<HierarquiaEntidade> hierarquiaEntidadeList1OrphanCheck = entidade.getHierarquiaEntidadeList1();
            for (HierarquiaEntidade hierarquiaEntidadeList1OrphanCheckHierarquiaEntidade : hierarquiaEntidadeList1OrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Entidade (" + entidade + ") cannot be destroyed since the HierarquiaEntidade " + hierarquiaEntidadeList1OrphanCheckHierarquiaEntidade + " in its hierarquiaEntidadeList1 field has a non-nullable nomesuperclasse field.");
            }
            List<ParticipacaoEntidadeRelacionamento> participacaoEntidadeRelacionamentoListOrphanCheck = entidade.getParticipacaoEntidadeRelacionamentoList();
            for (ParticipacaoEntidadeRelacionamento participacaoEntidadeRelacionamentoListOrphanCheckParticipacaoEntidadeRelacionamento : participacaoEntidadeRelacionamentoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Entidade (" + entidade + ") cannot be destroyed since the ParticipacaoEntidadeRelacionamento " + participacaoEntidadeRelacionamentoListOrphanCheckParticipacaoEntidadeRelacionamento + " in its participacaoEntidadeRelacionamentoList field has a non-nullable nomeentidade field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<DicionarioMER> dicionarioMERList = entidade.getDicionarioMERList();
            for (DicionarioMER dicionarioMERListDicionarioMER : dicionarioMERList) {
                dicionarioMERListDicionarioMER.getEntidadeList().remove(entidade);
                dicionarioMERListDicionarioMER = em.merge(dicionarioMERListDicionarioMER);
            }
            List<Tabela> tabelaList = entidade.getTabelaList();
            for (Tabela tabelaListTabela : tabelaList) {
                tabelaListTabela.getEntidadeList().remove(entidade);
                tabelaListTabela = em.merge(tabelaListTabela);
            }
            em.remove(entidade);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Entidade> findEntidadeEntities() {
        return findEntidadeEntities(true, -1, -1);
    }

    public List<Entidade> findEntidadeEntities(int maxResults, int firstResult) {
        return findEntidadeEntities(false, maxResults, firstResult);
    }

    private List<Entidade> findEntidadeEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Entidade.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Entidade findEntidade(String id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Entidade.class, id);
        } finally {
            em.close();
        }
    }

    public int getEntidadeCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Entidade> rt = cq.from(Entidade.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
